﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloMagiPack.Entidades;
using DALMagiPack.Funcionalidad;
using BLLMagiPack.Managers;

namespace BLLMagiPack.Reporteros
{
    public class ReporteadorReloaded
    {
        public void GenerarBalanceAnal(int año, List<BalanceMensual> reporteAnualCategorias, List<BalanceMensualEstatico> reporteAnualEstático)
        {
            List<Meses> mesesUsados = new List<Meses>();
            GenerarBalancesMensuales(año, reporteAnualCategorias, mesesUsados);
            GenerarReporteEstatico(año, reporteAnualEstático, mesesUsados);
        }

        private void GenerarBalancesMensuales(int año, List<BalanceMensual> reporteAnualCategorias, List<Meses> mesesUsados)
        {
            List<Movimiento> movimientosAnuales = new BLLMovimiento().TraerMovimientosPorAño(año);
            BLLCategoria bllCategoria = new BLLCategoria();

            var movimientosPorMesCategoria = (from m in movimientosAnuales
                                              group m by new { m.Fecha.Month, m.IdCategoria } into mov
                                              select mov);

            foreach (var item in movimientosPorMesCategoria)
            {
                Meses mes = (Meses)item.Key.Month;
                Categoria categoria = bllCategoria.TraerCategoria(item.Key.IdCategoria);
                BalanceMensual mensualIngresos = new BalanceMensual();
                mensualIngresos.Item = categoria.Nombre + " [+]";
                mensualIngresos.Mes = mes.ToString();
                mensualIngresos.Monto = item.Where(m => m.EsIngreso).Select(m => m.Monto).Sum();
                mensualIngresos.Orden = categoria.OrdenReporte;

                if (mensualIngresos.Monto > 0)
                    reporteAnualCategorias.Add(mensualIngresos);

                BalanceMensual mensualGastos = new BalanceMensual();
                mensualGastos.Item = categoria.Nombre + " [-]";
                mensualGastos.Mes = mes.ToString();
                mensualGastos.Monto = item.Where(m => !m.EsIngreso).Select(m => m.Monto).Sum();
                mensualGastos.Orden = categoria.OrdenReporte;

                if (mensualGastos.Monto > 0)
                    reporteAnualCategorias.Add(mensualGastos);

                if (!mesesUsados.Contains(mes))
                    mesesUsados.Add(mes);
            }
        }

        private void GenerarReporteEstatico(int año, List<BalanceMensualEstatico> reporteAnualEstatico, List<Meses> mesesUsados)
        {
            BLLMovimiento bllMovimiento = new BLLMovimiento();
            BLLCheque bllCheque = new BLLCheque();
            List<Movimiento> movimientosAnuales = new BLLMovimiento().TraerMovimientosPorAño(año);

            for (int i = 1; i <= 12; i++)
            {
                if (!mesesUsados.Contains((Meses)i))
                    continue;

                BalanceMensualEstatico mensual = new BalanceMensualEstatico();
                mensual.Mes = (Meses)i;

                List<Movimiento> movimentoMensuales = movimientosAnuales.Where(m => m.Fecha.Month == i).ToList();

                decimal gastosBanco = (from m in movimentoMensuales
                                       where m.EsBanco && !m.EsIngreso
                                       select m.Monto).Sum();
                decimal gastosCaja = (from m in movimentoMensuales
                                      where !m.EsBanco && !m.EsIngreso
                                      select m.Monto).Sum();
                decimal ingresosBanco = (from m in movimentoMensuales
                                         where m.EsBanco && m.EsIngreso
                                         select m.Monto).Sum();
                decimal ingresosCaja = (from m in movimentoMensuales
                                        where !m.EsBanco && m.EsIngreso
                                        select m.Monto).Sum();

                mensual.TotalGastos = gastosBanco + gastosCaja;
                mensual.SaldoBanco = ingresosBanco - gastosBanco;
                mensual.SaldoCaja = ingresosCaja - gastosCaja;
                mensual.Utilidad = mensual.SaldoBanco + mensual.SaldoCaja;
                mensual.Cheques = bllCheque.CalcularSaldoActualPorMes(i);
                reporteAnualEstatico.Add(mensual);
            }
        }
    }
}
